import { InitRMB } from '../../battle/Const';
import { BuildingType, UnitType, PlayerType } from '../../battle/Enums';
import { BuildingModel, UnitModel } from '../../battle/Model';
import { LOG } from '../../ConsoleLogCtrl';

/**
 * 玩家数据类
 * 管理玩家的单位和建筑集合
 */
export class Player {
    private id: string;
    private color: string;
    private startPosition: { x: number; y: number };
    private playerType: PlayerType;
    private units: Map<number, UnitModel> = new Map();
    private buildings: Map<number, BuildingModel> = new Map();
    private rmb: number = InitRMB; // 玩家资源（RMB）

    constructor(id: string, color: string, startPosition: { x: number; y: number }, playerType: PlayerType) {
        this.id = id;
        this.color = color;
        this.startPosition = { ...startPosition };
        this.playerType = playerType;
    }

    /**
     * 获取玩家ID
     */
    public getId(): string {
        return this.id;
    }

    /**
     * 获取玩家颜色
     */
    public getColor(): string {
        return this.color;
    }

    /**
     * 获取玩家起始位置
     */
    public getStartPosition(): { x: number; y: number } {
        return { ...this.startPosition };
    }

    /**
     * 获取玩家类型
     */
    public getPlayerType(): PlayerType {
        return this.playerType;
    }

    /**
     * 判断是否为左侧玩家（玩家1）
     */
    public isLeftSidePlayer(): boolean {
        return this.playerType === PlayerType.PLAYER1;
    }

    /**
     * 判断是否为右侧玩家（玩家2）
     */
    public isRightSidePlayer(): boolean {
        return this.playerType === PlayerType.PLAYER2;
    }

    /**
     * 添加单位
     * @param unit 单位模型
     */
    public addUnit(unit: UnitModel): void {
        this.units.set(unit.id, unit);
    }

    /**
     * 添加建筑
     * @param building 建筑模型
     */
    public addBuilding(building: BuildingModel): void {
        this.buildings.set(building.id, building);
    }

    /**
     * 获取单位
     * @param unitId 单位ID
     */
    public getUnit(unitId: number): UnitModel | undefined {
        return this.units.get(unitId);
    }

    /**
     * 获取建筑
     * @param buildingId 建筑ID
     */
    public getBuilding(buildingId: number): BuildingModel | undefined {
        return this.buildings.get(buildingId);
    }

    /**
     * 获取所有单位
     */
    public getAllUnits(): UnitModel[] {
        return Array.from(this.units.values());
    }

    /**
     * 获取所有建筑
     */
    public getAllBuildings(): BuildingModel[] {
        return Array.from(this.buildings.values());
    }

    /**
     * 移除单位
     * @param unitId 单位ID
     */
    public removeUnit(unitId: number): boolean {
        return this.units.delete(unitId);
    }

    /**
     * 移除建筑
     * @param buildingId 建筑ID
     */
    public removeBuilding(buildingId: number): boolean {
        return this.buildings.delete(buildingId);
    }

    /**
     * 获取玩家资源（RMB）
     */
    public getRmb(): number {
        return this.rmb;
    }

    /**
     * 增加玩家资源（RMB）
     * @param value 增加的资源值
     */
    public addRmb(value: number): void {
        this.rmb += value;
        LOG.log(`玩家${this.id}资源增加：${value}，当前总资源：${this.rmb}`);
    }

    /**
     * 扣除玩家资源（RMB）
     * @param value 扣除的资源值
     * @returns 是否扣除成功（资源是否足够）
     */
    public deductRmb(value: number): boolean {
        if (this.rmb < value) {
            LOG.error(`玩家${this.id}资源不足，当前资源：${this.rmb}，需要资源：${value}`);
            return false;
        }
        this.rmb -= value;
        LOG.log(`玩家${this.id}资源扣除：${value}，当前总资源：${this.rmb}`);
        return true;
    }
}